package com.wty.shop.common;

import com.wty.shop.util.PropertiesUtil;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
 * @Author 34355
 * @Create 2018-01-29-18:36
 */
public class RedisPool {
    //声明jedis连接池
    private static JedisPool pool;
    private static Integer maxTotal = Integer.parseInt(PropertiesUtil.getProperty("redis.max.total", "20"));
    private static Integer maxIdle = Integer.parseInt(PropertiesUtil.getProperty("redis.max.idle", "10"));
    private static Integer minIdle = Integer.parseInt(PropertiesUtil.getProperty("redis.min.idle", "2"));
    private static Boolean testOnBorrow = Boolean.parseBoolean(PropertiesUtil.getProperty("redis.test.borrow"));
    private static Boolean testOnReturn = Boolean.parseBoolean(PropertiesUtil.getProperty("redis.test.return"));

    private static String redisIp = PropertiesUtil.getProperty("redis1.ip");
    private static Integer redisPort = Integer.parseInt(PropertiesUtil.getProperty("redis1.port"));


    //初始化连接池
    private static void initPool() {
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(maxTotal);//设置最大连接数
        config.setMaxIdle(maxIdle);//最大连接数
        config.setMinIdle(minIdle);//最小连接数
        //生产环境为了性能 一般不进行验证操作
        config.setTestOnBorrow(testOnBorrow);//在borrow一个jedis实例的时候，是否要进行验证操作，如果赋值true。则得到的jedis实例肯定是可以用的。
        config.setTestOnReturn(testOnReturn);//在return一个jedis实例的时候，是否要进行验证操作，如果赋值true。则放回jedispool的jedis实例肯定是可以用的。

        config.setBlockWhenExhausted(true); //连接耗尽时，是否进入阻塞状态，false进入阻塞状态，true直至阻塞时尽

        pool = new JedisPool(config, redisIp, redisPort, 1000 * 2);//阻塞时间 2秒


    }

    //随着tomcat启动项目，随着类加载而调用初始化方法，进行连接池的初始化

    static {
        initPool();
    }

    //获得jedis实例
    public static Jedis getJedis(){
        return pool.getResource();
    }

    //返回jedis资源
    public static void returnResource(Jedis jedis){
        pool.returnResource(jedis);
    }
    //使用出错的归还
    public static void returnBorkenResource(Jedis jedis){
        pool.returnBrokenResource(jedis);
    }

}
